package com.haifeng.jupiter.common.datasource.identifier;

import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.haifeng.jupiter.common.core.properties.SystemProperties;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * <p>
 *  全局ID生成策略
 * </p>
 *
 * @author: Haifeng
 * @date: 2020-08-11
 */
@Slf4j
@Component
@AllArgsConstructor
public class Identifier implements IdentifierGenerator {

    private final SystemProperties systemProperties;

    /**
     * 全局唯一ID：生成19位数字型字符串（JavaScript数字型最大17位，用数字会丢失精度，
     * 数字型字符串便于主键索引排序）
     * @param entity
     * @return
     */
    @Override
    public Long nextId(Object entity) {

        // 随机产生5位数据中心ID和5位终端ID,取值范围：0-31
        long datacenterId = systemProperties.getDatacenterId();
        long workerId = systemProperties.getWorkerId();
        Snowflake snowflake = IdUtil.getSnowflake(workerId, datacenterId);
        // 会自动与String进行转换
        return snowflake.nextId();
    }
}
